package br.com.Bolao.application.controller.usuarios;

import br.com.Bolao.application.controller.BaseController;
import br.com.Bolao.application.dao.apostas.ApostaDAO;
import br.com.Bolao.application.dao.equipes.EquipeDAO;
import br.com.Bolao.application.dao.jogos.JogoDAO;
import br.com.Bolao.application.dao.usuarios.UsuarioDAO;
import br.com.Bolao.model.Aposta;
import br.com.Bolao.model.Equipe;
import br.com.Bolao.model.Jogo;
import br.com.Bolao.model.Usuario;
import java.util.Collection;
import java.util.List;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.AutoCreate;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.security.Identity;

/**
 *
 * @author frederico.cruz
 */
@AutoCreate
@Scope(ScopeType.CONVERSATION)
@Name("usuarioService")
public class UsuarioService extends BaseController {

    @In
    private UsuarioDAO usuarioDAO;
    @In
    private ApostaDAO apostaDAO;
    @In
    private JogoDAO jogoDAO;
    @In
    private Identity identity;
    @In
    private EquipeDAO equipeDAO;
    private Integer pontuacao;

    public String apostarCampeao(Integer campeaoSelecionado) throws Exception {
        String nomeUsuario = identity.getCredentials().getUsername();
        Usuario usuario = usuarioDAO.obterPorUsuario(nomeUsuario);

        //valida se equipe já foi apostada
        if (equipeDAO.obterEquipePorId(campeaoSelecionado).equals(usuario.getVicecampeao())) {
            throw new Exception("A aposta do campeão não pode ser a mesma do vice-campeão");
        }
        Equipe campeao = equipeDAO.obterEquipePorId(campeaoSelecionado);
        usuario.setCampeao(campeao);
        usuarioDAO.salvar(usuario);
        return campeao.getNome();
    }

    public String apostarVice(Integer viceSelecionado) throws Exception {
        String nomeUsuario = identity.getCredentials().getUsername();
        Usuario usuario = usuarioDAO.obterPorUsuario(nomeUsuario);
        //valida se equipe já foi apostada
        if (equipeDAO.obterEquipePorId(viceSelecionado).equals(usuario.getCampeao())) {
            throw new Exception("A aposta do vice-campeão não pode ser a mesma do campeão");
        }
        Equipe vice = equipeDAO.obterEquipePorId(viceSelecionado);
        usuario.setVicecampeao(vice);
        usuarioDAO.salvar(usuario);
        return vice.getNome();
    }

    /*
     * Método que calcula os pontos feitos para cada usuário cadastrado no sistema
     * e que tenha feito apostas
     * */
    public void atualizarPontuacao() {
        try {
            List<Usuario> listaUsuario = usuarioDAO.obterTodos();
            for (Usuario usuario : listaUsuario) {
                pontuacao = 0;
                Collection<Aposta> listaApostas = usuario.getApostaCollection();
                for (Aposta aposta : listaApostas) {

                    if (aposta.getResultado() == null) {
                        adicionarMensagemErro("Usuário " + usuario.getLogin() + " não fez todas as apostas!");
                        continue;
                    }

                    if (aposta.getFkJogo().getGolsTime1() == null || aposta.getFkJogo().getGolsTime2() == null) {
                        adicionarMensagemErro("Jogo " + aposta.getFkJogo().getTime1().getNome() + " x " + aposta.getFkJogo().getTime2().getNome() + " ainda não tem resultado");
                        continue;
                    }

                    /*Pontuação de acerto do placar do jogo*/
                    /* Pontuação de acerto do resultado do jogo(vitória
                     * empate ou derrota).
                     */
                    if (aposta.getFkJogo().getGolsTime1().equals(aposta.getGolsTime1()) &&
                            aposta.getFkJogo().getGolsTime2().equals(aposta.getGolsTime2())) {
                        System.out.println("3 pontos");
                        aposta.setPontos(3);
                        apostaDAO.salvar(aposta);
                        pontuacao += 3;
                    } else if (aposta.getResultado().equals(aposta.getFkJogo().getResultado())) {
                        System.out.println("1 ponto");
                        aposta.setPontos(1);
                        apostaDAO.salvar(aposta);
                        pontuacao += 1;
                    } else {
                        System.out.println("Nenhum ponto");
                        aposta.setPontos(0);
                        apostaDAO.salvar(aposta);
                    }
                }
                usuario.setPontuacao(pontuacao);
                usuarioDAO.atualizar(usuario);
                adicionarMensagemInformacao("Usuário " + usuario.getLogin() + " sincronizado com sucesso!");
            }
        } catch (Exception e) {
            adicionarMensagemErro("Ocorreu algum erro na atualização dos pontos dos usuário. " + e + " Entre em contato com mbsolutions.bh@gmail.com");
        }
    }

    /**
     * Método que sincroniza(cria/salva) as apostas que podem ser feitas pelo usuário.
     * Método é chamado no momento de criação do usuário.
     * @param usuario
     */
    public void sincronizaUsuarioJogos(Usuario usuario) {
        try {
            Aposta aposta;
            List<Jogo> listaJogos = jogoDAO.obterTodos();
            for (Jogo jogo : listaJogos) {
                aposta = new Aposta();
                aposta.setGolsTime1(null);
                aposta.setGolsTime2(null);
                aposta.setFkUsuario(usuario);
                aposta.setFkJogo(jogo);
                apostaDAO.salvar(aposta);
            }
        } catch (Exception e) {
            adicionarMensagemErro("Não foi possível sincronizar os jogos!\n" + e + "\nEntre em contato com mbsolutions@gmail.com");
        }
    }
}
